﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using estudent.Models;
using System.Data.Objects.SqlClient;

namespace estudent.Controllers
{
    public class PrijavaIzpitController : Controller
    {
        estudentEnt db = new estudentEnt();

        public ActionResult Index()
        {
            string vpisna = Session["Name"].ToString();//od studenta vpisna

            //vpisi od studenta
            var vpisi = db.Vpisis.Where(v => v.username == vpisna).OrderBy(v => v.letoVpisa);
            //odstranit prvic v letnik vpis, ce je ponavljal pol tudi ta letnik
            List<Vpisi> listVpisi = vpisi.ToList<Vpisi>();
            if (vpisi.Any(v => v.idVrstaVpisa == "V2"))
            {
                var vpisiV2 = vpisi.Where(v=>v.idVrstaVpisa=="V2");
                foreach (var vpis in vpisiV2)
                {
                    Vpisi prvicVpis = vpisi.FirstOrDefault(v=>v.idLetnikStudija==vpis.idLetnikStudija&&v.sSmer==vpis.sSmer);
                    listVpisi.Remove(prvicVpis);
                }
            }

            ViewData["vpisi"] = listVpisi;
            return View();
        }

        public string PoisciPredmete(FormCollection form)
        {
            string result = "";

            decimal idVpis=Decimal.Parse(form["vpisi"]);

            IEnumerable<sPredmeti> predmeti = db.Vpisis.FirstOrDefault(v=>v.idVpisa==idVpis).sPredmetis;

            string vpisna = Session["Name"].ToString();

            //ze opravljeni
            IEnumerable<sPredmeti> opravljeni = from p in db.PrijaveNaIzpits
                                   where p.Vpisi.username == vpisna && (p.koncnaOcena > 6 || p.koncnaOcenaVaj > 6)
                                   select p.IzpitniRoki.Poucuje.sPredmeti;

            predmeti=predmeti.Except(opravljeni);
                                 

            result = "<option value='prazen'>Izberi predmet</option>";
            foreach (var pred in predmeti)
            {
                result+= "<option value='"+pred.sPredmeta+"'>"+pred.imePredmeta+" - "+pred.sPredmeta+"</option>";
            }

            return result;
        }

        public string PoisciRoke(FormCollection form)
        {
            string result = "";

            decimal idPred = Decimal.Parse(form["predmeti"]);
            DateTime zdejle = DateTime.Now;
            IEnumerable<IzpitniRoki> roki = db.IzpitniRokis.Where(r=>r.Poucuje.sPredmeta==idPred&&r.datumRoka>=zdejle);
            result = "<option value='prazen'>Izberi rok</option>";
            foreach (var rok in roki)
            {
                result += "<option value='" + rok.idPoucuje + "," + rok.datumRoka.ToBinary() + "'>" + String.Format("{0:dd/MM/yyyy}", rok.datumRoka) + " (" + rok.Poucuje.SProfesorji1.imeProfesor + " " + rok.Poucuje.SProfesorji1.priimekProfesor + ((rok.Poucuje.SProfesorji2 != null) ? ", " + rok.Poucuje.SProfesorji2.imeProfesor + " " + rok.Poucuje.SProfesorji2.priimekProfesor : "") + ((rok.Poucuje.SProfesorji != null) ? ", " + rok.Poucuje.SProfesorji.imeProfesor + " " + rok.Poucuje.SProfesorji.priimekProfesor : "") + ")</option>";
            }

            return result;
        }

        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Prijava(FormCollection form)
        {
            Session["tempb"]=form["predmeti"];

            string[] id = form["roki"].Split(new char[] { ',' });
            decimal idPouc = Decimal.Parse(id[0]);
            DateTime datum = DateTime.FromBinary(long.Parse(id[1]));

            decimal idVpis = Decimal.Parse(form["vpisi"]);

            PrijaveNaIzpit prijava = new PrijaveNaIzpit();

            bool placat = false;
            try
            {
                prijava.datumRoka = datum;
                prijava.idPoucuje = idPouc;
                prijava.idVpisa = idVpis;
                


                //preverimo ali je tri dni pred rokom prijava
                DateTime dons = DateTime.Now;

                int trenutnoStudLeto=(dons.Month >= 10)? dons.Year : (dons.Year - 1);

                if (datum<(dons.AddDays(3)))
                {
                    ViewData["uspeh"] = false;
                    ViewData["sporocilo"] = "Neuspešna prijava na izpit. Morate se prijaviti vsaj 3 dni pred izpitnim rokom.";
                    return View("Rezultat");
                }

                //ali je vsaj 14 dni od zadnjega polaganja
                PrijaveNaIzpit prejsni = db.PrijaveNaIzpits.OrderByDescending(p => p.datumRoka).FirstOrDefault(p=>p.idPoucuje==idPouc && p.idVpisa==idVpis);
                DateTime meja=new DateTime();
                if(prejsni!=null)
                    meja = prejsni.datumRoka.AddDays(13);
                if (prejsni != null && meja > datum)
                {
                    ViewData["uspeh"] = false;
                    ViewData["sporocilo"] = "Neuspešna prijava na izpit. Nazadnje ste polagali ta izpit pred manj kot 14 dnevi.";
                    return View("Rezultat");
                }

                //max 3 stevilo prijav v tekocem studijskem letu
                DateTime zacStudLeta = new DateTime(trenutnoStudLeto,10,1);
                DateTime konStudLeta = new DateTime(trenutnoStudLeto+1,9,30);
                int steviloPrijavTek = db.PrijaveNaIzpits.Where(p => p.idPoucuje == idPouc && p.idVpisa == idVpis && (p.datumRoka>=zacStudLeta && p.datumRoka<=konStudLeta)).Count();
                if (steviloPrijavTek >= 3)
                {
                    ViewData["uspeh"] = false;
                    ViewData["sporocilo"] = "Neuspešna prijava na izpit. V letošnjem študijskem letu ste že 3x prijavili na ta izpit.";
                    return View("Rezultat");
                }

                //max 6 stevilo prijav v celotnem obdobju
                string vpisna = Session["Name"].ToString();
                int steviloPrijav = 0;
                steviloPrijav = db.PrijaveNaIzpits.Where(p=>p.idPoucuje==idPouc && p.idVpisa==idVpis).Count();
                if (steviloPrijav >= 6)
                {
                    ViewData["uspeh"] = false;
                    ViewData["sporocilo"] = "Neuspešna prijava na izpit. Prijavili ste se že 6x na ta izpit.";
                    return View("Rezultat");
                }

                //preveri prijavo na ze opravljen izpit
                PrijaveNaIzpit opravljen = db.PrijaveNaIzpits.FirstOrDefault(p=>p.idPoucuje==idPouc&&p.Vpisi.username==vpisna&&(p.koncnaOcena>=6||p.koncnaOcenaVaj>=6));
                if (opravljen != null)
                {
                    ViewData["uspeh"] = false;
                    ViewData["sporocilo"] = "Neuspešna prijava na izpit. Ta izpit ste že opravili.";
                    return View("Rezultat");
                }

                //preverimo placilo za izpit, se pravi pavzer ali 4. polaganje oz ce ponavlja , se zacne na novo
                //ali je otrocad pavzirano

                Vpisi obstaja = db.Vpisis.FirstOrDefault(v=>v.username==vpisna && trenutnoStudLeto==v.letoVpisa.Year);
                if (obstaja == null)//pavzer
                {
                    placat = true;
                }
                else
                {
                    int steviloPr = db.PrijaveNaIzpits.Where(p => p.idPoucuje == idPouc && p.idVpisa==idVpis).Count();
                    if (steviloPr >= 3)
                    {
                        placat = true;
                    }
                }


                //
                ///////////////////////////////////////////////////////////////////////////////////////
                string skupno="";
                Vpisi vpis=db.Vpisis.FirstOrDefault(v=>v.idVpisa==idVpis);
                int sk = db.PrijaveNaIzpits.Where(p => p.idPoucuje == idPouc && p.idVpisa == vpis.idVpisa).Count();
                int pr = 0;
                skupno = "" + (sk+1);
                if (vpis.idVrstaVpisa.CompareTo("V2") == 0)//ce je ponavljalec
                {
                    //najdemo prvic v letniku
                    Vpisi prvic = db.Vpisis.FirstOrDefault(v=>v.username==vpis.username&&v.sSmer==vpis.sSmer&&v.idLetnikStudija==vpis.idLetnikStudija&&v.idVrstaVpisa=="V1");
                    pr = db.PrijaveNaIzpits.Where(p => p.idPoucuje == idPouc && p.idVpisa == prvic.idVpisa).Count();
                    skupno = "" + (sk + pr+1) + " - " + pr;
                }
                int skupnoStLetu = steviloPrijavTek+1;
                ////////////////////////////////////////////////////////////////////////////////////////

                db.AddToPrijaveNaIzpits(prijava);
                db.SaveChanges();
                ViewData["uspeh"] = true;
                string sporocilce = "Uspešno ste se prijavili na izpitni rok predmeta <b>" + prijava.IzpitniRoki.Poucuje.sPredmeti.imePredmeta + "</b>, dne <b>" + String.Format("{0:dd/MM/yyyy}", prijava.datumRoka)+"</b>.</br>Skupno število polaganj: "+skupno+"</br>Število polaganj v tem študijskem letu: "+skupnoStLetu+"</br></br><a href='../OdjavaIzpitaReferentka'>Pregled prijav.</a>";
                if (placat)
                    sporocilce+= "</br></br><font color='red'>Izpit bo potrebno plačati. Po izpitnem roku bo poslana položnica za plačilo izpita na vaš naslov.</font>";
                ViewData["sporocilo"] = sporocilce;
                return View("Rezultat");
            }
            catch(Exception e)
            {
                ViewData["uspeh"] = false;
                ViewData["sporocilo"] = "Neuspešna prijava na izpit. Ste že prijavljeni na ta izpit.";
                return View("Rezultat");
            }
        }

        public string getSession()
        {
            return (Session["tempb"] != null) ? Session["tempb"].ToString() : "prazen";
        }

        /*
        //
        // GET: /PrijavaIzpit/

        public ActionResult Index()
        {
            string studUser = Session["Name"].ToString();

            Studenti student = db.Studentis.First(s=>s.username == studUser);//dobim studenta

            IEnumerable<Vpisi> studVpisi = student.Vpisis;//njegovi vpisi



            var smeri = (from v in studVpisi
                        join s in db.SSmeris on v.sSmer equals s.sSmer
                        select s).Distinct();
            
            var letniki = from v in studVpisi
                          join s in db.SSmeris on v.sSmer equals s.sSmer
                          join l in db.LetnikiStudijas on v.idLetnikStudija equals l.idLetnikStudija
                          select l;//dobimo letnike, ki je seveda jih toliko kolikor je vpisov


            ViewData["letniki"] = letniki;
            ViewData["smeri"] = smeri;

            return View("PrijavaIzpit");
        }

        public string vrniIzpitneRoke(FormCollection form)
        {
            decimal letnik = Decimal.Parse(form["letnik"]);

            string studUser = Session["Name"].ToString();
            Studenti student = db.Studentis.FirstOrDefault(s => s.username == studUser);//dobim studenta
            Vpisi studVpis = student.Vpisis.FirstOrDefault(v=>v.idLetnikStudija==letnik);//njegovi vpisi

            IEnumerable<sPredmeti> njegoviPredmetiGledeNaLetnik = null;

            IEnumerable<ObvezenPredmet> njegoviPredId = db.ObvezenPredmets.Where(o=>o.sSmer==studVpis.sSmer && o.idLetnik==letnik);

            IEnumerable<sPredmeti> njegoviPred = from o in njegoviPredId
                                                 join p in db.sPredmetis on o.sPredmeta equals p.sPredmeta
                                                 select p;
            
            njegoviPred = njegoviPred.Union(studVpis.sPredmetis);

            //izpitniroki
            IEnumerable<IzpitniRoki> roki = from p in njegoviPred
                                            join r in db.IzpitniRokis on p.sPredmeta equals r.sPredmeta
                                            select r;


            string result = @"  <tr>
    <td><label>Zap. št.</label>&nbsp;</td>
    <td><label>Profesor</label></td>
    <td><label>Predmet</label></td>
    <td><label>Datum Izpita</label></td>

    <td><label>Število vseh opravljanj</label></td>
    <td><label>Število letošnjih opravljanj</label></td>

    <td><label>Predavalnica</label>&nbsp;</td>
    <td><label>Prijavi?</label></td>
  </tr>";

            int j = 1;
            foreach(var r in roki){

                SProfesorji prof2 = db.SProfesorjis.FirstOrDefault(p => p.sProfesor == r.sProfesor2);
                SProfesorji prof3 = db.SProfesorjis.FirstOrDefault(p => p.sProfesor == r.sProfesor3);

                result += "<tr>";
                result += "<td>"+j+"</td>";
                result += "<td>"+r.SProfesorji.priimekProfesor+" "+r.SProfesorji.imeProfesor+((prof2!=null)? ", "+prof2.priimekProfesor+" "+prof2.imeProfesor : "")+((prof3!=null)? ", "+prof3.priimekProfesor+" "+prof3.imeProfesor : "")+"</td>";
                result += "<td>"+r.sPredmeti.imePredmeta+"</td>";
                result += "<td>" + String.Format("{0:dd/MM/yyyy HH:mm}", r.datumRoka) + "</td>";
                result += "<td></td>";
                result += "<td></td>";
                result += "<td>"+r.prostor+"</td>";
                result += "<td></td>";
                result += "</tr>";
                j++;
            }


            return result;
        }
        */
    }
}
